<?php
// added by yinchao, Tue December 05 11:00	2023
/**
 * 调用的逻辑是 支付宝调用 epay's alipay 的异步通知, 然后 epay 调用这里,
 * 这个文件是模拟实际的商家回调地址, 由商家指定.
 * 因为本地测试没有域名, 所以用 epay 的页面做测试, 
 * 这个文件仅仅作为测试, 将会被删除
 */

/**
 * 测试 return page.
 */

// {
//     "gmt_create":"2023-12-04 15:07:03",
//     "gmt_payment":"2023-12-04 15:07:07",
//     "charset":"UTF-8",

//     "notify_time":"2023-12-04 15:07:08",
//     "subject":"\u8d2d\u4e7040\u9897\u94bb\u77f3",

//     "buyer_id":"2088412997354930",
//     "invoice_amount":"0.01",
//     "version":"1.0",

//     "notify_id":"2023120401222150708054931440420311",
//     "fund_bill_list":"[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",        // 支付金额信息

//     "notify_type":"trade_status_sync",
//     "out_trade_no":"2023120415065554816",
//     "total_amount":"0.01",                       // 订单金额
//     "trade_status":"TRADE_SUCCESS",
//     "trade_no":"2023120422001454931404731524",
//     "auth_app_id":"2021004124638114",
//     "receipt_amount":"0.01",                     // 实收金额
//     "point_amount":"0.00",
//     "buyer_pay_amount":"0.01",                   // 用户支付的金额
//     "app_id":"2021004124638114",
//     "sign_type":"RSA2",
//     "seller_id":"2088441949054666",
//     "sign":"UgCI8TeEuPwdcg94pxEcut1rHmGK9irzV9mPOY4hAagYEMdCYB3cncdyJL6VT6V+7HQvJEwhIxdh13XYsguilcyFNHeJXCda4v51oKBO6W7eaDiTiwJFrdINIjbqPufHdR+eeOoI4UTbXefFFKCeAjAPATAXSVQgELElLrWQ0Z6cLgQPJtlcjsegMHP8xD4zgmOrRXNWIvdX0xB8smN+ebhaP60ynJHhExlkupl+PSYU7a5otO1+2FxuKjxQ7mj1EfHf6jtNCMCsiGYbVmoIttX58AA890urEhzXCX4vBFJg0ZForqKtwrQcjWmmKHwNbdkMfkBkMsJ0fbvdKjK9Ig==",
// }

/**
 * 列举所需要的参数
 * result,                      // 表明支付结果是否成功, 支付宝对应的字段是 ok
 * pay_message,                 // 没用上, 可以没有
 * agent_id,                    // 商家在第三方支付的 id, 新支付对应的 id 是 uid, 如: 1002. [pre_user]
 * jnet_bill_no,                // heepay_order_number, 我们可以用 epay 的 trade_no 代替, 它表示 epay 生成的唯一的订单号
 * agent_bill_id,               // 原商城自己生成的唯一订单号, 我们用 epay 的 out_tarde_no 代替, 它表示商城自己生成的唯一订单号
 * pay_type,                    // 没什么用, 可以没有
 * pay_amt,                     // 表示真实的价格, 我们可以用支付宝的 total_amount 代替, 它是订单金额
 * remark,                      // 一个什么掩码, 做安全验证用的, 我们用 key 作为替代.
 * sign,                        // md5 值, 表示对参数的签名
 */

/**
 * 实际传入的参数
 * pid,                         // 商家(我们自己后台)的 uid,        类似原来的 agent_id
 * trade_no,                    // epay 生成的唯一 id               类似原来的 jnet_bill_no
 * out_trade_no,                // 商家自己生成的唯一 ID,           类似原来的 agent_bill_no
 * type,                        // 发起订单时, 自己指定的 type,     类似原来的 pay_type
 * name,                        // 商品名字(购买40颗钻石),          类似原来的 pay_message
 * money,                       // 订单金额,                        类似原来的 pay_amt
 * trade_status,                // 表示是否支付成功,                类似原来的 result
 * sign,                        // 签名
 * sign_type,                   // 签名类似, 默认值为 MD5
 */

// 开始编码
// epay 用的 get 方法回调的 By contrast, 支付宝用的是 post 回调的.

use \lib\PayUtils;

require './includes/common.php';

$logfile_name = date('Ymd') . '-testnotify' . '.log';
// mylog($logfile_name, json_encode($_GET));

// 检查参数是否都有
if (
    !isset($_GET['pid']) ||
    !isset($_GET['trade_no']) ||
    !isset($_GET['out_trade_no']) ||
    !isset($_GET['type']) ||
    !isset($_GET['name']) ||
    !isset($_GET['money']) ||
    !isset($_GET['trade_status']) ||
    !isset($_GET['sign']) ||
    !isset($_GET['sign_type'])
) {
    mylog($logfile_name, '参数缺失(lack of parametes)');
    echo 'failed';
    exit;
    // sysmsg('参数缺失');
}

// 验签
$key    = 'Fdd7I8gGSI9qf5Rr0SQd7IdqigDdC65r';
$params = [
    'pid'          => $_GET['pid'],
    'trade_no'     => $_GET['trade_no'],
    'out_trade_no' => $_GET['out_trade_no'],
    'type'         => $_GET['type'],
    'name'         => $_GET['name'],
    'money'        => $_GET['money'],
    'trade_status' => $_GET['trade_status'],
];
if (PayUtils::md5Sign(PayUtils::createLinkstring(PayUtils::argSort(PayUtils::paraFilter($params))), $key) !== $_GET['sign']) {
    mylog($logfile_name, '验签失败, failed for yanqian');
    // sysmsg('验签失败');
    echo 'failed';
    exit;
}

// 测试
echo 'success';
exit;

// 检查本地订单
// $m           = M('cardordertemp_tb');
// $order_value = $m->where('heepay_ordernumber="' . $_GET["out_trade_no"] . '"')->select();
// if (count($order_value) <= 0) {      // 没有结果
//     $m     = M('cardorder_tb');
//     $value = $m->where('heepay_ordernumber="' . $_GET['trade_no'] . '"')->select();
//     if (count($value) > 0) {        // 订单号已经存在了
//         echo "error";
//         exit;
//     }

//     //没有的订单, todo...
//     $m1                     = M('cardorderfatal_tb');
//     $m1->heepay_ordernumber = $_GET['trade_no'];
//     $m1->frompaytype        = 'epay';
//     // $m1->heepay_errorcode   = $errorcode;
//     // $m1->heepay_agentid     = $heepay_agentid;
//     $m1->add();

//     echo 'failed';
//     exit;
// } else {    // 检验数据一致性
//     if (
//         round($_GET['money'], 2) !== round($real_price, 2) ||
//         $_GET['trade_status'] !== 'TRADE_SUCCESS' ||
//         $_GET['shopid'] !== $order_value[0]['cardshop_id']      // 自定义数据不参加验签, 但是需要与数据库数据检测一次, 保证数据一致性
//     ) {
//         echo '数据与本地订单不对应';
//         exit;
//         // sysmsg('数据与本地订单不对应');
//     }

//     // 检测商品是否存在
//     $m          = M('cardshop_tb');
//     $shop_value = $m->where('id=' . $order_value[0]['cardshop_id'])->select();
//     if (count($shop_value) <= 0) {
//         sysmsg('商品id不存在');
//     }
//     $price      = $shop_value[0]['price'];
//     $real_price = $shop_value[0]['realprice'];
// }

// try {
//     // 修改 cardorder_tb
//     $m                         = M('cardorder_tb');
//     $m->id                     = $order_value[0]["id"];
//     $m->userid                 = $order_value[0]["userid"];
//     $m->gameid                 = $order_value[0]["gameid"];
//     $m->cardshop_id            = $order_value[0]["cardshop_id"];
//     $m->platform               = $order_value[0]["platform"];
//     $m->paytype                = $order_value[0]["paytype"];
//     $m->heepay_agent_bill_time = $order_value[0]["heepay_agent_bill_time"];
//     $m->heepay_agent_token_id  = $order_value[0]["heepay_agent_token_id"];

//     $m->heepay_ordernumber  = $_GET['trade_no'];
//     $m->price               = $_GET['money'];
//     $m->cardcount           = $shop_value[0]['cardcount'];
//     $m->createdate          = $order_value[0]["createdate"];
//     $m->appindex            = $order_value[0]["appindex"];
//     $m->tellordernumberdate = date("Y-m-d H:i:s", time());
//     $m->finishdate          = date("Y-m-d H:i:s", time());
//     $m->add();

//     // 增加玩家钻石
//     $m            = M("user_tb");
//     $userinfo     = $m->where('userid=' . $order_value[0]["userid"])->select();
//     $m->cardcount = $userinfo[0]["cardcount"] + $shop_value[0]['cardcount'];
//     $m->where('userid=' . $order_value[0]["userid"])->save();

//     // 删除 cardordertemp_tb 记录
//     $m = M('cardordertemp_tb');
//     $m->where('id=' . $order_value[0]["id"])->delete();

//     // 计算, 要给代理分成的钱
//     $theappindex = appindexfromgroupid($userinfo[0]["groupid"]);
//     if (FFConfig('AgentMode', $theappindex) == 1) { //自提款模式
//         $redis         = new PublishRedis();
//         $m             = M("agentuserrelation_tb");
//         $agentinfo     = null;
//         $upagentinfo   = null;
//         $upupagentinfo = null;
//         $value         = $m->where("userid=" . $order_value[0]["userid"])->select();

//         //查询玩家绑定的代理信息
//         if (count($value) > 0) {
//             $m         = M("agent_tb");
//             $agentinfo = $m->where("userid=" . $value[0]["agentuserid"])->select();
//             if (count($agentinfo) > 0 && $agentinfo[0]["userid"] != FFConfig('dn_agent_highest_userid', $theappindex)) {
//                 $upagentinfo = $m->where("userid=" . $agentinfo[0]["upuserid"])->select();
//                 if (count($upagentinfo) > 0 && $upagentinfo[0]["userid"] != FFConfig('dn_agent_highest_userid', $theappindex)) {
//                     $upupagentinfo = $m->where("userid=" . $upagentinfo[0]["upuserid"])->select();
//                     if (count($upupagentinfo) > 0 && $upupagentinfo[0]["userid"] != FFConfig('dn_agent_highest_userid', $theappindex)) {

//                     } else {
//                         $upupagentinfo = null;
//                     }
//                 } else {
//                     $upagentinfo = null;
//                 }
//             } else {
//                 $agentinfo = null;
//             }
//         }

//         $month     = date("Y-m");
//         $now       = time();
//         $startDate = date('Y-m-d 00:00:00', mktime(0, 0, 0, date('m', $now), '1', date('Y', $now)));
//         $endDate   = date('Y-m-d 23:39:59', mktime(0, 0, 0, date('m', $now), date('t', $now), date('Y', $now)));
//         //直属代理收益更新
//         if ($agentinfo != null) {
//             $theuserid      = $agentinfo[0]["userid"];
//             $levelcalculate = $redis->get("levelcalculate:" . $month . ":" . $theuserid);
//             if ($levelcalculate == null) {
//                 $levelcalculate = $this->calculateflow($theuserid, $startDate, $endDate);
//             } else {
//                 $levelcalculate += $_GET['money'];
//             }
//             $redis->set("levelcalculate:" . $month . ":" . $theuserid, $levelcalculate);

//             $level  = $agentinfo[0]["agentlevel"];
//             $aspect = FFConfig('dn_agent_payaspect', $theappindex);
//             if ($levelcalculate < FFConfig('dn_agent_pay_amount', $theappindex)) {
//                 $level = 0;
//             } else if ($levelcalculate < FFConfig('dn_superagent_pay_amount', $theappindex)) {
//                 $level = 1;
//             } else {
//                 $level = 2;
//             }
//             if ($level > $agentinfo[0]["agentlevel"]) {
//                 $m             = M("agent_tb");
//                 $m->agentlevel = $level;
//                 $m->where("userid=" . $theuserid)->save();
//             } else {
//                 $level = $agentinfo[0]["agentlevel"];
//             }

//             if ($level == 0) {
//                 $aspect = FFConfig('dn_agent_payaspect', $theappindex);
//             } else if ($level == 1) {
//                 $aspect = FFConfig('dn_superagent_payaspect', $theappindex);
//             } else {
//                 $aspect = FFConfig('dn_supersuperagent_payaspect', $theappindex);
//             }

//             $addamount = $_GET['money'] * $aspect;

//             while ($redis->lock("agentlevellock:" . $agentinfo[0]["userid"]) == false) {
//                 usleep(2);
//             }

//             $m = M();
//             $m->execute("update agent_tb set ownmoney=ownmoney+" . $addamount . " where userid=" . $agentinfo[0]["userid"]);

//             $redis->unlock("agentlevellock:" . $agentinfo[0]["userid"]);

//             $m                = M("b_cardordergain_tb");
//             $m->orderid       = $order_value[0]["id"];
//             $m->userid        = $agentinfo[0]["userid"];
//             $m->payaspect     = $aspect;
//             $m->originamounts = $_GET['money'];
//             $m->amounts       = $addamount;
//             $m->relalevel     = 0;
//             $m->finishdate    = $nowdate;
//             $m->add();
//         }

//         //上级收益更新
//         if ($upagentinfo != null) {
//             // 统计本周流水
//             $theuserid      = $upagentinfo[0]["userid"];
//             $levelcalculate = $redis->get("levelcalculate:" . $month . ":" . $theuserid);
//             if ($levelcalculate == null) {
//                 $levelcalculate = $this->calculateflow($theuserid, $startDate, $endDate);
//             } else {
//                 $levelcalculate += $_GET['money'];
//             }
//             $redis->set("levelcalculate:" . $month . ":" . $theuserid, $levelcalculate);

//             $level  = $upagentinfo[0]["agentlevel"];
//             $aspect = FFConfig('dn_agent_payaspect', $theappindex);
//             if ($levelcalculate < FFConfig('dn_agent_pay_amount', $theappindex)) {
//                 $level = 0;
//             } else if ($levelcalculate < FFConfig('dn_superagent_pay_amount', $theappindex)) {
//                 $level = 1;
//             } else {
//                 $level = 2;
//             }
//             if ($level > $upagentinfo[0]["agentlevel"]) {
//                 $m             = M("agent_tb");
//                 $m->agentlevel = $level;
//                 $m->where("userid=" . $theuserid)->save();
//             }
//             // -- 

//             while ($redis->lock("agentlevellock:" . $upagentinfo[0]["userid"]) == false) {
//                 usleep(2);
//             }

//             $aspect    = FFConfig('dn_agent2_payaspect', $theappindex);
//             $addamount = $_GET['money'] * $aspect;
//             $m         = M();
//             $m->execute("update agent_tb set ownmoney=ownmoney+" . $addamount . " where userid=" . $upagentinfo[0]["userid"]);

//             $redis->unlock("agentlevellock:" . $upagentinfo[0]["userid"]);

//             $m                = M("b_cardordergain_tb");
//             $m->orderid       = $order_value[0]["id"];
//             $m->userid        = $upagentinfo[0]["userid"];
//             $m->payaspect     = $aspect;
//             $m->originamounts = $_GET['money'];
//             $m->amounts       = $addamount;
//             $m->relalevel     = 1;
//             $m->finishdate    = $nowdate;
//             $m->add();


//         }

//         //上上级收益更新
//         if ($upupagentinfo != null) {
//             // 统计本周流水
//             $theuserid      = $upupagentinfo[0]["userid"];
//             $levelcalculate = $redis->get("levelcalculate:" . $month . ":" . $theuserid);
//             if ($levelcalculate == null) {
//                 $levelcalculate = $this->calculateflow($theuserid, $startDate, $endDate);
//             } else {
//                 $levelcalculate += $_GET['money'];
//             }
//             $redis->set("levelcalculate:" . $month . ":" . $theuserid, $levelcalculate);

//             $level  = $upupagentinfo[0]["agentlevel"];
//             $aspect = FFConfig('dn_agent_payaspect', $theappindex);
//             if ($levelcalculate < FFConfig('dn_agent_pay_amount', $theappindex)) {
//                 $level = 0;
//             } else if ($levelcalculate < FFConfig('dn_superagent_pay_amount', $theappindex)) {
//                 $level = 1;
//             } else {
//                 $level = 2;
//             }
//             if ($level > $upupagentinfo[0]["agentlevel"]) {
//                 $m             = M("agent_tb");
//                 $m->agentlevel = $level;
//                 $m->where("userid=" . $theuserid)->save();
//             }
//             // -- 


//             while ($redis->lock("agentlevellock:" . $upupagentinfo[0]["userid"]) == false) {
//                 usleep(2);
//             }

//             $aspect    = FFConfig('dn_agent3_payaspect', $theappindex);
//             $addamount = $_GET['money'] * $aspect;
//             $m         = M();
//             $m->execute("update agent_tb set ownmoney=ownmoney+" . $addamount . " where userid=" . $upupagentinfo[0]["userid"]);

//             $redis->unlock("agentlevellock:" . $upupagentinfo[0]["userid"]);

//             $m                = M("b_cardordergain_tb");
//             $m->orderid       = $order_value[0]["id"];
//             $m->userid        = $upupagentinfo[0]["userid"];
//             $m->payaspect     = $aspect;
//             $m->originamounts = $_GET['money'];
//             $m->amounts       = $addamount;
//             $m->relalevel     = 2;
//             $m->finishdate    = $nowdate;
//             $m->add();
//         }
//     }

//     $publishredis = new PublishRedis();
//     $publishstr   = "{99,'payback'," . $order_value[0]["userid"] . "}";
//     $publishredis->lpush("gm99", $publishstr);
//     echo 'success';
// } catch (\Exception $e) {
//     \Think\Log::write('HeepayException:' . $e->getMessage(), 'WARN');
//     echo "error";
// }

?>